## lesson 5.3 Работа с ORM

### Учебный материал:
- **Введение в занятие Работа с ORM**
- **Базы данных**
<details> 

**Для чего нужна база данных:**
- хранение данных,
- обработка данных,
- управление данными,
- совместная работа нескольких пользователей.

У стандартных файлов есть ряд недостатков по сравнению с базой данных:
1. При хранении в файле нужно самостоятельно писать проверки структуры.
2. Возможна потеря данных в случае ошибок.
3. С файлом сложно работать нескольким людям.

Для работы с большим объёмом данных нужны высокоэффективные алгоритмы:
- поиск нужного элемента в файле,
- получение связанных данных из разных файлов,
- сортировка данных.

**СУБД** представляет собой совокупность формата хранения и кода для работы с данными, однако для разработчика СУБД — сочетание *драйвера* и *языковых запросов SQL*.

Популярные СУБД:

- MySQL,
- PostgreSQL,
- SQLite,
- Oracle и другие.

**Таблица (база данных)** — это совокупность связанных данных, хранящихся в структурированном виде. Таблица состоит из *столбцов* и *строк*, где строки называются **записью (кортежем)**, а столбцы — **атрибутами или полями (доменами)**.

Поле, каждое значение которого однозначно определяет соответствующую запись, называется **простым ключом** или **primary key (ключевым полем)**. В этом случае это поле id.

SQL — язык работы с данными:
```SQL
-- запрашиваем разные сущности, хранящиеся в отдельных таблицах

SELECT name, birthday, gender FROM person;
  
SELECT brand, name, color FROM car;
```
```SQL
Можно и из связанных данных получать общую картину:
-- у кого какая машина
SELECT person.name, car.brand, car.name
  FROM person INNER JOIN car ON car.id = person.car_id
```
Связь позволяет моделировать отношения между объектами. Существует 4 типа связей:
1. **Один к одному** — любому экземпляру сущности А соответствует только один экземпляр сущности В и наоборот. Этот тип связи редко используется. Например, для расширения таблицы.
2. **Один ко многим** — любому экземпляру сущности А соответствует 0, 1 или несколько экземпляров сущности В, но любому экземпляру сущности В соответствует только один экземпляр сущности А. Например: один учитель — много учеников.
3. **Многие к одному** — любому экземпляру сущности А соответствует только один экземпляр сущности В, но любому экземпляру сущности В соответствует 0, 1 или несколько экземпляров сущности А. Например: много учителей — один ученик.
4. **Многие ко многим** — любому экземпляру сущности А соответствует 0, 1 или несколько экземпляров сущности В, и любому экземпляру сущности В соответствует 0, 1 или несколько экземпляров сущности А. Например: множество учеников — множество учителей. 

</details>

- **ORM, модели**
- **Модели в Django**

В Django ORM реализовано *[множество типов данных](https://docs.djangoproject.com/en/3.2/ref/models/fields/#model-field-types)* для атрибутов моделей:

Чтобы выбрать правильный тип для атрибута, необходимо проанализировать поставленную задачу и определить тип по допустимым значениям.

Так как модель это Python класс, то в модели, помимо описания атрибутов, можно реализовывать методы и свойства.

Например, можно реализовать магический метод str, чтобы получить желаемое отображение объекта при выводе на экран:

```Python
class Car(models.Model):
    …

    def __str__(self):
        return f'{self.brand}, {self.model}: {self.color}'
```

- **Запросы к БД**
[Все виды запросов здесь](https://docs.djangoproject.com/en/3.2/ref/models/querysets/#field-lookups)
- **Создание БД проекта. Управление БД из админки Django**
- **Обратная связь по видео**
- **Презентация к видео "Работа с ORM"**
- **[Код к занятию (листинг)](../DJ_code/orm)**

### Дополнительные материалы:

- [Настройка конфигурации для дебаггера в VS Code](../lesson_5.1/debug_config)
- [Пример настроенного файла конфигурации для дебага проекта Django](.vscode)

- [Курс по django](https://proglib.io/p/kurs-django-chast-1-django-chto-eto-obzor-i-ustanovka-freymvorka-struktura-proekta-2023-07-25)

- [ОЧЕНЬ КРУТОЙ курс по django на YouTube](https://www.youtube.com/playlist?list=PLA0M1Bcd0w8yU5h2vwZ4LO7h1xt8COUXl)

### [Мой код по материалам занятий](../lesson_5.1/dj_proect/)

### [Домашняя работа](../dj-homeworks/2.1-databases/)
#### Дополнительные материалы по домашке:
#### Пункт задания: Значение поля `slug` должно устанавливаться слагифицированным значением поля `name`:

- [Slug поле - помогите разобраться?](https://ru.stackoverflow.com/questions/1392051/slug-%D0%BF%D0%BE%D0%BB%D0%B5-%D0%BF%D0%BE%D0%BC%D0%BE%D0%B3%D0%B8%D1%82%D0%B5-%D1%80%D0%B0%D0%B7%D0%BE%D0%B1%D1%80%D0%B0%D1%82%D1%8C%D1%81%D1%8F)

- [SlugField – Django Models (синтаксис)](https://www.geeksforgeeks.org/slugfield-django-models/#field-options)

- [Добавляем слаги (slug) к URL-адресам](https://proproprogs.ru/django/dobavlyaem-slagi-slug-k-url-adresam)

- [Автоматическое формирование slug, обработка кириллицы в Django](https://proghunter.ru/articles/django-base-2023-automatic-slug-generation-cyrillic-handling-in-django-9)

#### Пункт задания: Написать скрипт для переноса данных из csv-файла в модель `Phone`:

- [Создание management commands в Django](https://habr.com/ru/articles/415049/)
